home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 44 / Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso / -in_the_mag- / workbench / pcmser / source / pcmser.device.s < prev    next >
Text File  |  1999-07-28  |  30KB  |  1,287 lines

  1.         incdir include/
  2.         include    exec/exec.i
  3.         include    exec/exec_lib.i
  4.         include    dos/dos_lib.i
  5.         include    devices/serial.i
  6.         include    resources/card.i
  7.         include    resources/cardres_lib.i
  8.  
  9.         incdir
  10.         include    modem/macros.i
  11.         include    modem/uart.i
  12.         include    modem/cistpl.i
  13.         include    modem/pcmser.i
  14.         
  15.  
  16. ;--Constants
  17. REVISION=6
  18. VERSION=0
  19. MYPRI=0
  20. UNITS=1
  21.         section    main,code
  22. ;------------------------------------------------------------------------
  23.  
  24. j        moveq    #0,d0    ;Stupid user tried to start us!
  25.         rts
  26.  
  27. initddescript    dc.w    RTC_MATCHWORD    ;RT_MATCHWORD
  28.         dc.l    initddescript    ;RT_MATCHTAG
  29.         dc.l    endofcode    ;RT_ENDSKIP
  30.         dc.b    RTF_AUTOINIT    ;RT_FLAGS
  31.         dc.b    VERSION        ;RT_VERSION
  32.         dc.b    NT_DEVICE    ;RT_TYPE
  33.         dc.b    MYPRI        ;RT_PRI
  34.         dc.l    myname
  35.         dc.l    idstring
  36.         dc.l    init
  37.  
  38. myname        dc.b    "pcmser.device",0
  39.         dc.b    "$VER: "
  40. idstring    dc.b    "pcmser.device 0.6 (24.08.97)",13,10,0
  41.         cnop    0,4
  42.  
  43. init        dc.l    MYDEV_SIZEOF
  44.         dc.l    functable
  45.         dc.l    datatable
  46.         dc.l    initroutine
  47.  
  48.  
  49. ;--Function table
  50. functable    dc.l    opendevice    ;open        -6
  51.         dc.l    closedevice    ;close        -12
  52.         dc.l    expunge        ;expunge    -18
  53.         dc.l    resvec        ;reserved    -24
  54.         dc.l    beginio        ;BeginIO     -30
  55.         dc.l    abortio        ;AbortIO    -36
  56.         dc.l    -1        ;marks end of list
  57.  
  58. ;---Data table
  59. datatable    dc.l    0
  60.         dc.l    0
  61.         dc.b    NT_DEVICE
  62.         dc.b    0
  63.         dc.l    myname
  64.  
  65.         dc.b    LIBF_SUMUSED!LIBF_CHANGED ;UBYTE   LIB_FLAGS
  66.         dc.b    0        ;UBYTE   LIB_pad
  67.         dc.w    0        ;UWORD   LIB_NEGSIZE
  68.         dc.w    0        ;UWORD   LIB_POSSIZE
  69.         dc.w    VERSION        ;UWORD   LIB_VERSION
  70.         dc.w    REVISION    ;UWORD   LIB_REVISION
  71.         dc.l    idstring    ;APTR    LIB_IDSTRING
  72.         dc.l    0        ;ULONG   LIB_SUM
  73.         dc.w    0        ;UWORD   LIB_OPENCNT
  74.  
  75. _SysBase    dc.l    0
  76. devicebase    dc.l    0
  77.  
  78. ;========================================================================
  79. ;---initroutine---
  80. ;d0=devicebase
  81. ;a0=seglist
  82. ;
  83. ;return d0
  84. ;devicebase=ok
  85. ;0=error
  86. ;========================================================================
  87. initroutine    movem.l    d1-a6,-(sp)
  88.         move.l    d0,a5
  89.         move.w    #VERSION,LIB_VERSION(a5)
  90.         move.w    #REVISION,LIB_REVISION(a5)
  91.         move.l    d0,devicebase
  92.         move.l    a0,MD_SEGLIST(a5)
  93.         move.l    4.w,_SysBase
  94.         bsr.w    setupdevice
  95.         tst.l    d0
  96.         beq.b    .ok
  97.         moveq    #0,d0
  98.         bra.b    .end
  99.  
  100. .ok        move.l    a5,d0
  101. .end        movem.l    (sp)+,d1-a6
  102.         rts
  103.  
  104. ;========================================================================
  105. ;---opendevice---   guaranteed to be single threaded
  106. ;d0=unit
  107. ;d1=flags
  108. ;a1=io-request
  109. ;a6=devicebase
  110. ;
  111. ;return IO_ERROR
  112. ;0=ok
  113. ;!0=errorcode
  114. ;========================================================================
  115. opendevice    move.l    a6,-(sp)
  116.         cmp.l    #UNITS,d0
  117.         bge.w    .error
  118.         clr.b    IO_ERROR(a1)
  119.  
  120.         mulu    #PCMNODE_SIZEOF,d0
  121.         add.l    #serdata,d0
  122.         move.l    d0,IO_UNIT(a1)
  123.         move.l    d0,a0        ;a0=serunit
  124.  
  125.         tst.w    PCM_UNITOPENCNT(a0)    ;fix the shared access stuff
  126.         bne.b    .not1st
  127.         movem.l    a0-a1,-(sp)        ;this is the 1st time the
  128.         sub.l    a1,a1            ;device opened
  129.         GET    SysBase
  130.         CALL    FindTask        ;get the owner of the device
  131.         movem.l    (sp)+,a0-a1
  132.         move.l    d0,PCM_OWNERTASK(a0)
  133.         bclr    #STATUSB_SHARED,PCM_FLAGS(a0)
  134.         btst    #SERB_SHARED,IO_SERFLAGS(a1)    ;use shared access?
  135.         beq.b    .sharedcont            ;no!
  136.         bset    #STATUSB_SHARED,PCM_FLAGS(a0)    ;yes!
  137.         bra.b    .sharedcont
  138.  
  139. .not1st        GET    SysBase
  140.         movem.l    a0/a1,-(sp)
  141.         sub.l    a1,a1
  142.         CALL    FindTask 
  143.         movem.l    (sp)+,a0/a1
  144.         cmp.l    PCM_OWNERTASK(a0),d0
  145.         beq.b    .no7wire        ;no need to check CTS/RTS again
  146.  
  147.         btst    #STATUSB_SHARED,PCM_FLAGS(a0)
  148.         beq.b    .sharederr
  149.         btst    #SERB_SHARED,IO_SERFLAGS(a1)    ;shared?
  150.         bne.b    .no7wire
  151.  
  152. .sharederr    move.b    #SerErr_DevBusy,IO_ERROR(a1)
  153.         bra.w    .end
  154.  
  155. .sharedcont    btst    #SERB_7WIRE,IO_SERFLAGS(a1)    ;CTS/RTS?
  156.         beq.b    .no7wire
  157.         bset    #STATUSB_USE7WIRE,PCM_FLAGS(a0)
  158.  
  159.         move.l    PCM_BASEADR(a0),a6
  160.         move.b    UART_MSR(a6),d0
  161.         btst    #4,d0
  162.         beq.b    .no7wire
  163.         bset    #STATUSB_CTS,PCM_FLAGS(a0)
  164.     
  165. .no7wire    move.l    devicebase(pc),a6
  166.         addq.w    #1,LIB_OPENCNT(a6)
  167.         addq.w    #1,PCM_UNITOPENCNT(a0)
  168.         bclr    #LIBB_DELEXP,MD_FLAGS(a6)
  169.  
  170.         move.l    #9600,IO_BAUD(a1)    ;fill in & set defult settings
  171.         move.b    #8,IO_READLEN(a1)
  172.         move.b    #8,IO_WRITELEN(a1)
  173.         move.b    #1,IO_STOPBITS(a1)
  174.         move.l    a0,-(sp)
  175.         bsr.w    setparams
  176.         move.l    (sp)+,a0
  177.  
  178.         move.l    PCM_BASEADR(a0),a1
  179.         move.b    #0,UART_FCR(a1)            ;FIFOs off
  180.         btst    #STATUSB_USEFIFO,PCM_FLAGS(a0)
  181.         beq.b    .nofifo
  182.         move.b    #7,UART_FCR(a1)            ;FIFOs on (yeah!!) 
  183.  
  184. .nofifo        move.b    UART_MSR(a1),d0            ;clear MSR
  185.         move.b    UART_RBR(a1),d0
  186.         move.b    UART_LSR(a1),d0
  187.         move.b    UART_IIR(a1),d0
  188.  
  189.         move.b    #%1011,UART_MCR(a1)        ;DTR/RTS/master int on
  190.         move.b    #%1111,UART_IER(a1)        ;enable all ints
  191.  
  192.         cmp.w    #1,PCM_UNITOPENCNT(a0)
  193.         bne.b    .notfirstopen
  194.         ;If this is the first time this unit is opened we need
  195.         ;to wait a little while to allow the modem to init itself
  196.         ;otherwise DSR wont come on and some programs will complain.
  197.         lea    dosname(pc),a1
  198.         moveq    #37,d0
  199.         GET    SysBase
  200.         CALL    OpenLibrary
  201.         move.l    d0,a6
  202.         beq.b    .notfirstopen 
  203.         move.l    #30,d1        
  204.         CALL    Delay
  205.         move.l    a6,a1
  206.         GET    SysBase
  207.         CALL    CloseLibrary
  208.  
  209. .notfirstopen    move.l    devicebase(pc),a0
  210.         bra.b    .end
  211.  
  212. .error        move.b    #IOERR_OPENFAIL,IO_ERROR(a1)
  213. .end        move.l    (sp)+,a6
  214.         rts
  215.  
  216. dosname        dc.b    "dos.library",0
  217.  
  218. ;========================================================================
  219. ;---closedevice---   guaranteed to be single threaded
  220. ;a6=devicebase
  221. ;a1=io-request
  222. ;
  223. ;return d0
  224. ;0=do nothing
  225. ;seglist=unload device
  226. ;========================================================================
  227. closedevice    move.l    IO_UNIT(a1),a0
  228.         move.l    #-1,IO_UNIT(a1)
  229.         move.l    #-1,IO_DEVICE(a1)
  230.  
  231.         clr.l    d0
  232.         subq.w    #1,LIB_OPENCNT(a6)
  233.         subq.w    #1,PCM_UNITOPENCNT(a0)    ;last opener closed us?
  234.         bne.b    .end
  235.  
  236.         move.l    PCM_BASEADR(a0),a0    ;in that case turn
  237.         move.b    #0,UART_MCR(a0)        ;master int off
  238.         move.b    #0,UART_IER(a0)        ;ints off
  239.  
  240.         btst    #LIBB_DELEXP,MD_FLAGS(a6)    ;delayed expunge?
  241.         bne.b    .doexp
  242.         btst    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a6) ;user removed card?
  243.         bne.b    .end
  244. .doexp        bsr.b    expunge                ;then expunge
  245. .end        rts
  246.  
  247. ;========================================================================
  248. ;---expunge---   guaranteed to be single threaded
  249. ;a6=devicebase
  250. ;
  251. ;return d0
  252. ;0=do nothing
  253. ;seglist=unload device
  254. ;========================================================================
  255. expunge        movem.l    d2/a5-a6,-(sp)
  256.         tst.w    LIB_OPENCNT(a6)
  257.         beq.b    .remove
  258.  
  259.         bset    #LIBB_DELEXP,MD_FLAGS(a6)    ;opencnt was not 0
  260.         clr.l    d0                ;do delayed expunge
  261.         bra.b    .end
  262.  
  263. .remove        move.l    a6,a5
  264.         bsr.w    cleanupdevice
  265.         move.l    MD_SEGLIST(a5),d2
  266.         move.l    a5,a1
  267.         REMOVE
  268.         move.l    a5,a1
  269.         moveq    #0,d0
  270.         move.w    LIB_NEGSIZE(a5),d0
  271.         suba.l    d0,a1
  272.         add.w    LIB_POSSIZE(a5),d0
  273.         GET    SysBase
  274.         CALL    FreeMem
  275.         move.l    d2,d0
  276.  
  277. ;        COLTESTR    ;!!!!!!!!!!!!!!!
  278.  
  279. .end        movem.l    (sp)+,d2/a5-a6
  280.         rts
  281. ;========================================================================
  282. ;---beginio---
  283. ;a6=devicebase
  284. ;a1=iorequest
  285. ;========================================================================
  286. beginio        movem.l    a6,-(sp)
  287.  
  288.         clr.b    IO_ERROR(a1)
  289.         move.b    #NT_MESSAGE,LN_TYPE(a1)
  290.  
  291. .noread        btst    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a6)
  292.         beq.b    .nocard        ;card is not configured (removed)
  293.  
  294.         clr.l    d0
  295.         move.w    IO_COMMAND(a1),d0
  296.         cmp.l    #SER_DEVFINISH+1,d0    ;Is IO_COMMAND to high?
  297.         bge.b    .unknowncmd
  298.         add.w    d0,d0
  299.         lea    .cmdtable(pc),a0
  300.         add.w    d0,d0
  301.         move.l    (a0,d0.w),a0
  302.         cmp.l    #0,a0            ;Unsupported command?
  303.         beq.b    .unknowncmd
  304.         jsr    (a0)            ;Jump to CMD-code
  305.         bra.b    .cont
  306.  
  307. .unknowncmd    move.b    #IOERR_NOCMD,IO_ERROR(a1)
  308.         clr.b    IO_FLAGS(a1)
  309.         GET    SysBase
  310.         CALL    ReplyMsg
  311.         bra.b    .cont
  312.  
  313. .nocard        cmp.w    #CMD_READ,IO_COMMAND(a1)
  314.         beq.b    .nocardreadreq
  315.         move.b    #IOERR_SELFTEST,IO_ERROR(a1)
  316.         clr.b    IO_FLAGS(a1)
  317.         GET    SysBase
  318.         CALL    ReplyMsg
  319.  
  320. .cont        movem.l    (sp)+,a6
  321.         rts
  322.  
  323. ;Since the user have removed the card we have to queue read-requests
  324. ;to that the program calling us won't hang in a loop trying to post an
  325. ;io-request to us all the time resulting in that it will hang.
  326. .nocardreadreq    move.l    IO_UNIT(a1),a0
  327.         lea    PCM_READLIST(a0),a0
  328.         GET    SysBase
  329.         CALL    AddTail
  330.         bra.b    .cont
  331.  
  332.         cnop    0,4
  333. .cmdtable    dc.l    0        ;0    CMD_INVALID
  334.         dc.l    cmd_reset    ;1    CMD_RESET
  335.         dc.l    cmd_read    ;2    CMD_READ
  336.         dc.l    cmd_write    ;3    CMD_WRITE
  337.         dc.l    0        ;4    CMD_UPDATE
  338.         dc.l    cmd_clear    ;5    CMD_CLEAR
  339.         dc.l    0        ;6    *CMD_STOP
  340.         dc.l    0        ;7    *CMD_START
  341.         dc.l    cmd_flush    ;8    CMD_FLUSH
  342.         dc.l    cmd_query    ;9    SDCMD_QUERY
  343.         dc.l    0;cmd_break    ;a    *SDCMD_BREAK
  344.         dc.l    cmd_setparams    ;b    SDCMD_SETPARAMS
  345.  
  346. ;========================================================================
  347. ;---abortio---
  348. ;a6=devicebase
  349. ;a1=iorequest
  350. ;========================================================================
  351. abortio        movem.l    a2/a6,-(sp)
  352.         GET    SysBase
  353.         CALL    Disable
  354.  
  355.         move.l    IO_UNIT(a1),a2
  356.         lea    PCM_READLIST(a2),a0
  357.         move.l    a1,-(sp)
  358.         bsr.b    removeioreq        ;queued readreq?
  359.         move.l    (sp)+,a1
  360.  
  361.         cmp.l    PCM_READREQ(a2),a1    ;current readreq?
  362.         bne.b    .notreadcurr
  363.         clr.l    PCM_READREMAIN(a2)
  364.         bsr.w    readdata
  365.         bra.b    .endabortio
  366.  
  367. .notreadcurr    lea    PCM_WRITELIST(a2),a0
  368.         move.l    a1,-(sp)
  369.         bsr.b    removeioreq        ;queued writereq?
  370.         move.l    (sp)+,a1
  371.  
  372.         move.l    PCM_WRITEREQ(a2),d0
  373.         cmp.l    d0,a1            ;current writereq?
  374.         bne.b    .notwritecurr
  375.  
  376.         clr.l    PCM_WRITEREMAIN(a2)
  377.         move.b    #IOERR_ABORTED,IO_ERROR(a1)
  378.         bsr.w    senddata
  379. .notwritecurr
  380.  
  381. .endabortio    CALL    Enable
  382.         movem.l    (sp)+,a2/a6
  383.         rts
  384.  
  385. ;========================================================================
  386. removeioreq    ;removes IO-request (a1) if in list (a0).
  387.  
  388.         move.l    a0,-(sp)
  389.         bsr.b    nodeinlist
  390.         move.l    (sp)+,a0
  391.         tst.l    d0
  392.         beq.b    .exit
  393.         move.l    a1,-(sp)
  394.         GET    SysBase
  395.         CALL    Remove
  396.         move.l    (sp)+,a1
  397.         move.b    #IOERR_ABORTED,IO_ERROR(a1)
  398.         clr.b    IO_FLAGS(a1)
  399.         CALL    ReplyMsg
  400. .exit        rts
  401.  
  402.  
  403. nodeinlist    ;d0 BOOL=nodeinlist(a0 list, a1 node)
  404.         move.l    LN_SUCC(a0),a0
  405.         cmp.l    a1,a0
  406.         beq.b    .found
  407.         tst.l    (a0)
  408.         bne.b    nodeinlist
  409.         moveq    #0,d0
  410.         rts
  411.  
  412. .found        move.l    a0,d0
  413.         rts
  414.  
  415. ;========================================================================
  416. resvec        moveq    #0,d0
  417.         rts
  418.  
  419. ;========================================================================
  420. ;---setupdevice--- executed on load of device
  421. ;========================================================================
  422. setupdevice    move.l    a2,-(sp)
  423.         moveq    #UNITS-1,d0
  424.         lea    serdata,a2
  425.  
  426. .initloop    lea    PCM_RECBUFF(a2),a1        ;init sernode-data
  427.         move.l    a1,PCM_RECBUFFPTR(a2)
  428.         move.l    a1,PCM_RECBUFFINPTR(a2)
  429.         move.l    a1,PCM_RECBUFFOUTPTR(a2)
  430.         move.l    #10240,PCM_RECBUFFSIZE(a2)
  431.  
  432.         move.l    #0,PCM_RECBUFFCURRSIZE(a2)
  433.         move.b    #0,PCM_FLAGS(a2)
  434.  
  435.         lea    PCM_WRITELIST(a2),a1
  436.         NEWLIST    a1
  437.         lea    PCM_READLIST(a2),a1
  438.         NEWLIST    a1
  439.         lea    PCMNODE_SIZEOF(a2),a2
  440.         dbf    d0,.initloop
  441.  
  442.         bsr.b    initcard
  443.         tst.l    d0
  444.         bne.b    .error
  445.  
  446.         bsr.b    configurecard
  447.         tst.l    d0
  448.         bne.b    .error
  449.  
  450.         moveq    #0,d0
  451.         bra.b    .end
  452.  
  453. .error        moveq    #-1,d0
  454. .end        move.l    (sp)+,a2
  455.         rts
  456.  
  457. ;========================================================================
  458. ;---cleanupdevice--- executed on expunge
  459. ;========================================================================
  460. cleanupdevice    bsr.w    releasecard
  461.         rts
  462.  
  463. ;========================================================================
  464. ;---initcard--- Gains ownership of the card.
  465. ;========================================================================
  466. initcard:    move.l    a6,-(sp)
  467.         lea    cardname(pc),a1
  468.         GET    SysBase
  469.         CALL    OpenResource
  470.         move.l    d0,_CardBase
  471.         beq.b    .error
  472.  
  473.         GET    CardBase
  474.         lea    cardhandle,a1
  475.         CALL    OwnCard
  476.         tst.l    d0
  477.         bne.b    .error
  478.         move.l    devicebase(pc),a0
  479.         bset    #DEVINFOB_OWNCARD,MD_MYFLAGS(a0)    ;We own card
  480.  
  481.         lea    cardhandle,a1
  482.         move.l    #CARD_DISABLEF_WP!CARD_ENABLEF_DIGAUDIO,d1
  483.         CALL    CardMiscControl
  484.  
  485.         moveq    #0,d0
  486.         bra.b    .end
  487.  
  488. .error        moveq    #1,d0
  489. .end        move.l    (sp)+,a6
  490.         rts
  491.  
  492. ;========================================================================
  493. ;---configurecard--- Confgures the card to show its IO-registers
  494. ;========================================================================
  495. configurecard    movem.l    d2/a6,-(sp)
  496.  
  497.         move.l    #CISTPL_FUNCID,d1        ;get functid-tuple
  498.         bsr.w    .gettuple
  499.         tst.l    d0
  500.         beq.w    .error
  501.         lea    tuplebuffer,a0
  502.         cmp.b    #2,2(a0)            ;is this a modem-card?
  503.         bne.w    .error
  504.  
  505.         move.l    #CISTPL_CFTABLE_ENTRY,d1    ;get confval
  506.         bsr.w    .gettuple
  507.         tst.l    d0
  508.         beq.w    .error
  509.         lea    tuplebuffer,a0
  510.         move.b    2(a0),d0
  511.         and.b    #$3f,d0                ;this value should be
  512.         move.b    d0,.confval            ;written into CCR
  513.  
  514.         move.l    #CISTPL_CONFIG,d1
  515.         bsr.w    .gettuple
  516.         tst.l    d0
  517.         beq.w    .error
  518.  
  519.         lea    tuplebuffer,a0
  520.         clr.l    d2                ;find out the offset
  521.         move.b    5(a0),d2            ;to the CCR
  522.         lsl.w    #8,d2
  523.         move.b    4(a0),d2
  524.  
  525.         GET    CardBase
  526.         CALL    GetCardMap
  527.         move.l    d0,a0
  528.         beq.b    .error
  529.         move.l    cmm_AttributeMemory(a0),a1    ;get attribmem base
  530.         add.l    d2,a1                ;now we have address
  531.         move.l    a1,confbase            ;of the CCR-register
  532.  
  533.         move.b    .confval(pc),d0
  534.         or.b    #$40,d0
  535.         move.b    d0,(a1)                ;Configure card!
  536.         or.b    #8,2(a1)            ;enable audio
  537.  
  538.         move.l    cmm_IOMemory(a0),d0
  539.         add.l    #$10000-$4000,d0
  540.         bsr.b    .findiobase
  541.         move.l    d0,iobase
  542.         beq.b    .error
  543.  
  544.         move.l    #CISTPL_FUNCE,d1        ;check if this is
  545.         bsr.b    .gettuple            ;16550 UART with FIFO
  546.  
  547.         lea    serdata,a0            ;set up iobase(s)
  548.         move.l    iobase(pc),PCM_BASEADR(a0)
  549.         bclr    #STATUSB_USEFIFO,PCM_FLAGS(a0)
  550.  
  551.         tst.l    d0
  552.         beq.b    .fifo
  553.  
  554. ;Found one modem without FUNCE-tuple (Angia 28.8)
  555. ;If this is the case we assume 16550-UART
  556.  
  557.         lea    tuplebuffer,a1
  558.         cmp.b    #2,3(a1)
  559.         bne.b    .nofifo
  560. .fifo        bset    #STATUSB_USEFIFO,PCM_FLAGS(a0)
  561.         
  562. .nofifo        move.l    devicebase(pc),a0
  563.         bset    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a0)    ;Card configged
  564.         moveq    #0,d0
  565.         bra.b    .end
  566.  
  567. .error        moveq    #-1,d0
  568. .end        movem.l    (sp)+,d2/a6
  569.         rts
  570.  
  571. .gettuple    move.l    a6,-(sp)
  572.         lea    cardhandle(pc),a1
  573.         lea    tuplebuffer,a0
  574.         move.l    #100,d0
  575.         GET    CardBase
  576.         CALL    CopyTuple
  577.         move.l    (sp)+,a6
  578.         rts
  579.  
  580. .findiobase    move.l    d7,-(sp)
  581.         move.l    d0,a0
  582.         lea    .iobases(pc),a1
  583.         move.w    #3,d7
  584.  
  585. .findbaseloop    clr.l    d0
  586.         move.w    (a1)+,d0
  587.         move.b    #0,UART_MCR(a0,d0)
  588.         move.b    $bfe001,d1        ;wait a little
  589.         btst    #1,UART_MCR(a0,d0)
  590.         bne.b    .nobase
  591.         move.b    #2,UART_MCR(a0,d0)
  592.         move.b    $bfe001,d1
  593.         btst    #1,UART_MCR(a0,d0)
  594.         beq.b    .nobase
  595.         add.l    a0,d0            ;iobase found!
  596.         bra.b    .endfindiobase
  597.  
  598. .nobase        dbf    d7,.findbaseloop
  599.         clr.l    d0            ;iobase not found!
  600. .endfindiobase    move.l    (sp)+,d7
  601.         rts
  602.  
  603. .iobases    dc.w    $3f8,$2f8,$3e8,$2e8
  604. .confval    dc.b    0
  605.         cnop    0,4
  606.  
  607. ;========================================================================
  608. ;---releasecard---
  609. ;========================================================================
  610. releasecard    move.l    a6,-(sp)
  611.         GET    SysBase
  612.         CALL    Disable
  613.         move.l    devicebase(pc),a0
  614.         btst    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a0)
  615.         beq.b    .notconfigured
  616.         move.l    confbase(pc),a1
  617.         move.b    #$80,(a1)    ;do a softreset
  618.         move.b    #0,(a1)
  619.         bclr    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a0)
  620.  
  621. .notconfigured    btst    #DEVINFOB_OWNCARD,MD_MYFLAGS(a0)
  622.         beq.b    .end
  623.         GET    CardBase
  624.         move.l    #CARDF_REMOVEHANDLE,d0
  625.         lea    cardhandle,a1
  626.         CALL    ReleaseCard
  627.         move.l    devicebase(pc),a0
  628.         bclr    #DEVINFOB_OWNCARD,MD_MYFLAGS(a0)
  629.         GET    SysBase
  630.         CALL    Enable
  631. .end        move.l    (sp)+,a6
  632.         rts
  633.  
  634. _CardBase    dc.l    0
  635. cardname:    dc.b    "card.resource",0
  636. iobase        dc.l    0
  637. confbase    dc.l    0
  638.         
  639. cardhandle    dc.l    0
  640.         dc.l    0
  641.         dc.b    0
  642.         dc.b    0
  643.         dc.l    myname
  644.         dc.l    cardremoveint
  645.         dc.l    0
  646.         dc.l    cardstatusint
  647.         dc.b    CARDF_IFAVAILABLE
  648.         cnop    0,4
  649.  
  650.  
  651. cardstatusint    dc.l    0
  652.         dc.l    0
  653.         dc.b    0
  654.         dc.b    0
  655.         dc.l    0
  656.         dc.l    0
  657.         dc.l    statusintcode
  658.  
  659. cardremoveint    dc.l    0
  660.         dc.l    0
  661.         dc.b    0
  662.         dc.b    0
  663.         dc.l    0
  664.         dc.l    0
  665.         dc.l    cardremintcode
  666.  
  667. ;========================================================================
  668. ;---cardremintcode--- Shit, that damn user has removed the card!!
  669. ;========================================================================
  670. cardremintcode    movem.l    a2/a6,-(sp)
  671.         move.l    devicebase(pc),a0    ;mark card as not configured
  672.         bclr    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a0)
  673.         lea    serdata,a2
  674.         moveq    #UNITS-1,d0
  675.  
  676. .resetloop    move.l    d0,-(sp)
  677.         bsr.w    reset            ;remove all IO-requests
  678.         move.l    (sp)+,d0
  679.         lea    PCMNODE_SIZEOF(a2),a2    ;from all units
  680.         dbf    d0,.resetloop
  681.         movem.l    (sp)+,a2/a6
  682.         rts
  683.  
  684. ;========================================================================
  685. ;---statusintcode---
  686. ;========================================================================
  687. statusintcode    btst    #CARD_STATUSB_IRQ,d0
  688.         beq.b    .nopcmciairq
  689.         movem.l    a2/a5/a6,-(sp)
  690.         move.w    d0,-(sp)
  691.  
  692. .intloop    lea    serdata,a2
  693.         move.l    PCM_BASEADR(a2),a5
  694.         move.b    UART_IIR(a5),d0
  695.         btst    #0,d0
  696.         bne.b    .exit
  697.  
  698.         bra.b    .checkint
  699. ;        bra.b    .intloop
  700.  
  701. .exit        move.w    (sp)+,d0
  702.         move.w    d0,d1
  703.         eor.b    #$2c,d0
  704.         or.b    #$c0,d0
  705.         move.b    d0,$da9000        ;nasty workaround for a
  706.                         ;nasty bug i card.resource :(
  707.         move.b    UART_IIR(a5),d0
  708.         btst    #0,d0
  709.         bne.b    .end
  710.         move.w    #0,d1
  711.         move.w    d1,-(sp)
  712.         bra.b    .checkint
  713.  
  714. .end        movem.l    (sp)+,a2/a5/a6
  715.  
  716.         move.b    #0,d0
  717. .nopcmciairq    rts
  718.  
  719. .checkint    and.b    #%110,d0
  720.         cmp.b    #%110,d0
  721.         bne.b    .nolsrint
  722.         bsr.b    linestatusint
  723.         bra.b    .checkintexit
  724.  
  725. .nolsrint    cmp.b    #%100,d0
  726.         bne.b    .norecint
  727.         bsr.w    recdata
  728.         bra.b    .checkintexit
  729.  
  730. .norecint    cmp.b    #%010,d0
  731.         bne.b    .notransint
  732.         bsr.w    senddata
  733.         bra.b    .checkintexit
  734.  
  735. .notransint    cmp.b    #%000,d0
  736.         bne.b    .nomsrint
  737.         bsr.b    modemstatusint
  738. .nomsrint
  739.  
  740. .checkintexit    bra.b    .intloop
  741.  
  742.  
  743. ;========================================================================
  744. ;---linestatusint--- an error has occured!
  745. ;========================================================================
  746. linestatusint:    move.b    UART_LSR(a5),d0
  747.         btst    #1,d0            ;Hardware overrun?
  748.         beq.b    .nooe
  749.         move.b    #SerErr_LineErr,d0
  750.         bra.b    .error
  751.  
  752. .nooe        btst    #2,d0            ;Parity error?
  753.         beq.b    .nope
  754.         move.b    #SerErr_ParityErr,d0
  755.         bra.b    .error
  756.  
  757. .nope        btst    #3,d0            ;Framing error?
  758.         beq.b    .nofe
  759.         move.b    #SerErr_LineErr,d0
  760.         bra.b    .error
  761.  
  762. .nofe        btst    #4,d0
  763.         beq.b    .nobi
  764.         move.b    #SerErr_DetectedBreak,d0
  765.         bra.b    .error
  766. .nobi        rts
  767.  
  768. .error        tst.l    PCM_READREQ(a2)        ;is there a current readreq?
  769.         beq.b    .noreq    
  770.         move.b    #3,UART_FCR(a5)        ;clear receive-fifo
  771.         move.l    PCM_READREQ(a2),a1    ;then abort the shit
  772.         clr.l    PCM_READREMAIN(a2)
  773.         move.b    d0,IO_ERROR(a1)
  774.         bsr.b    readdata
  775. .noreq        rts
  776.  
  777. ;========================================================================
  778. ;---modemstatusint---
  779. ;========================================================================
  780. modemstatusint    move.b    UART_MSR(a5),d0
  781.         btst    #4,d0
  782.         beq.b    .nocts
  783.  
  784.         btst    #STATUSB_CTS,PCM_FLAGS(a2)    ;CTS activated now?
  785.         bne.b    .ctscont
  786.  
  787.         bset    #STATUSB_CTS,PCM_FLAGS(a2)    ;CTS was activated now!
  788.         bsr.w    senddata            ;so resume sending
  789.         bra.b    .ctscont
  790.  
  791. .nocts        bclr    #STATUSB_CTS,PCM_FLAGS(a2)    ;stop sending!
  792. .ctscont    rts
  793.  
  794. ;========================================================================
  795. ;---recdata-- Reads data from UART and buffers it.
  796. ;a2=unitptr
  797. ;========================================================================
  798. recdata        move.l    PCM_RECBUFFPTR(a2),a1
  799.         move.l    PCM_RECBUFFSIZE(a2),d1
  800.         add.l    d1,a1                ;end_of_buffer ptr
  801.  
  802.         move.l    PCM_RECBUFFINPTR(a2),a0        ;current bufferpos 
  803.         move.l    PCM_RECBUFFCURRSIZE(a2),d0    ;current buffersize
  804.  
  805. .writebuff    cmp.l    d1,d0                ;recbuffer full?
  806.         bne.b    .notfull
  807.         subq.l    #1,d0                ;buff full. Overwrite!
  808.         move.l    a0,PCM_RECBUFFOUTPTR(a2)
  809.         addq.l    #1,PCM_RECBUFFOUTPTR(a2)
  810.  
  811. .notfull    move.b    UART_RBR(a5),(a0)+        ;read from UART->buffer
  812.         addq.l    #1,d0
  813.  
  814.         cmp.l    a0,a1                ;Will buffer wrap?
  815.         bne.b    .nowrap
  816.         move.l    PCM_RECBUFFPTR(a2),a0
  817. .nowrap    
  818.         btst    #0,UART_LSR(a5)            ;more data in FIFO?
  819.         bne.b    .writebuff
  820.         move.l    a0,PCM_RECBUFFINPTR(a2)        ;update bufferpos
  821.         move.l    d0,PCM_RECBUFFCURRSIZE(a2)    ;and size
  822.         ;no RTS here. Go directly to readdata
  823.  
  824. ;========================================================================
  825. ;---readdata-- Reads data from receive-buffer and writes it to IOrequest
  826. ;a2=unitptr
  827. ;========================================================================
  828. readdata    tst.l    PCM_READREQ(a2)
  829.         beq.b    .nodatainbuff
  830.  
  831.         tst.l    PCM_READREMAIN(a2)
  832.         beq.w    .readklar
  833.  
  834.         tst.l    PCM_RECBUFFCURRSIZE(a2)
  835.         beq.b    .nodatainbuff
  836.  
  837. .moredata    move.l    PCM_RECBUFFOUTPTR(a2),a0
  838.         move.l    PCM_READPTR(a2),a1
  839.         move.b    (a0),d0
  840.         move.b    d0,(a1)
  841.  
  842.         move.l    PCM_READREQ(a2),a1
  843.         btst    #SERB_EOFMODE,IO_SERFLAGS(a1)    ;use EOF-mode?
  844.         beq.b    .noeofmode
  845.         lea    IO_TERMARRAY(a1),a0
  846.  
  847.         moveq    #7,d1
  848. .checkeofloop    cmp.b    (a0)+,d0            ;look for termchars
  849.         bne.b    .noeof
  850.         move.l    #1,PCM_READREMAIN(a2)        ;let's terminate early
  851. .noeof        dbf    d1,.checkeofloop
  852.  
  853. .noeofmode    addq.l    #1,IO_ACTUAL(a1)
  854.         addq.l    #1,PCM_RECBUFFOUTPTR(a2)
  855.         addq.l    #1,PCM_READPTR(a2)
  856.         subq.l    #1,PCM_RECBUFFCURRSIZE(a2)
  857.  
  858.         move.l    PCM_RECBUFFOUTPTR(a2),d0
  859.         move.l    PCM_RECBUFFPTR(a2),d1
  860.         add.l    PCM_RECBUFFSIZE(a2),d1    ;End of buffer?
  861.         cmp.l    d0,d1
  862.         bne.b    .nowrap
  863.         move.l    PCM_RECBUFFPTR(a2),PCM_RECBUFFOUTPTR(a2)
  864.  
  865. .nowrap        subq.l    #1,PCM_READREMAIN(a2)
  866.         beq.b    .readklar
  867.         tst.l    PCM_RECBUFFCURRSIZE(a2)
  868.         bne.b    .moredata
  869.  
  870. ;here the devices internal read-buffer is empty but there is request for
  871. ;more bytes, so it's time to activate the receive-FIFO if there is request
  872. ;for more than 4 bytes.
  873.  
  874. .nodatainbuff    btst    #STATUSB_USEFIFO,PCM_FLAGS(a2)
  875.         beq.b    .nofifo
  876.  
  877.         move.l    PCM_BASEADR(a2),a0
  878.         cmp.l    #14,PCM_READREMAIN(a2)
  879.         bge.b    .use14bytes
  880.         cmp.l    #8,PCM_READREMAIN(a2)
  881.         bge.b    .use8bytes
  882.         cmp.l    #4,PCM_READREMAIN(a2)
  883.         bge.b    .use4bytes
  884.         bra.b    .use1byte
  885.  
  886. .use14bytes    move.b    #%11000001,UART_FCR(a0)
  887.         rts
  888.  
  889. .use8bytes    move.b    #%10000001,UART_FCR(a0)
  890.         rts
  891.  
  892. .use4bytes    move.b    #%01000001,UART_FCR(a0)
  893.         rts
  894.  
  895. .use1byte    move.b    #%00000001,UART_FCR(a0)        ;triggerlevel=1 bytes
  896. .nofifo        rts
  897.  
  898. .readklar    move.l    PCM_READREQ(a2),a1
  899.         clr.l    PCM_READREQ(a2)
  900.         GET    SysBase
  901.         CALL    ReplyMsg
  902.  
  903.         lea    PCM_READLIST(a2),a0        ;any queued requests?  
  904.         CALL    RemHead
  905.         tst.l    d0
  906.         beq.w    .nodatainbuff
  907.         move.l    d0,PCM_READREQ(a2)        ;activate queued request
  908.         move.l    d0,a1
  909.         move.l    IO_DATA(a1),PCM_READPTR(a2)
  910.         move.l    IO_LENGTH(a1),PCM_READREMAIN(a2)
  911.         bra.w    readdata
  912.         rts
  913.  
  914. ;========================================================================
  915. ;---cmd_read---
  916. ;a1=IORequest
  917. ;========================================================================
  918. cmd_read    move.l    a2,-(sp)
  919.         move.b    MD_MYFLAGS(a6),d0    ;we need this one later
  920.         
  921.         clr.b    IO_FLAGS(a1)        ;no quick IO.
  922.         clr.l    IO_ACTUAL(a1)
  923.         GET    SysBase
  924.         CALL    Disable            ;wont trash d0
  925.         move.l    IO_UNIT(a1),a2
  926.  
  927.         move.l    IO_DATA(a1),a0        ;This should not be needed
  928.         clr.b    (a0)            ;but stupid Ncomm requires this
  929.  
  930.         tst.l    PCM_READREQ(a2)        ;Any pending Requests?
  931.         beq.b    .noque
  932. .queue
  933.         cmp.l    PCM_READREQ(a2),a1    ;Stupid NComm strikes again and
  934.         beq.b    .exit            ;tries to send the same IO
  935.                         ;twise without an AbortIO()
  936.  
  937.         lea    PCM_READLIST(a2),a0
  938.         CALL    AddTail
  939.         bra.b    .exit
  940.  
  941. .noque        move.l    a1,PCM_READREQ(a2)
  942.         move.l    IO_DATA(a1),PCM_READPTR(a2)
  943.         move.l    IO_LENGTH(a1),PCM_READREMAIN(a2)
  944.         bsr.w    readdata
  945.  
  946. .exit        CALL    Enable
  947.         move.l    (sp)+,a2
  948.         rts
  949.  
  950. ;========================================================================
  951. ;---senddata---
  952. ;a2=unitptr
  953. ;========================================================================
  954. senddata    tst.l    PCM_WRITEREQ(a2)    ;is there really an active
  955.         beq.b    .nowritereq        ;io-request?
  956.  
  957.         tst.l    PCM_WRITEREMAIN(a2)    ;more bytes to send?
  958.         bne.b    .sendmore
  959.  
  960.         move.l    PCM_WRITEREQ(a2),a1    ;current sendio is ready!
  961.         clr.l    PCM_WRITEREQ(a2)
  962.         clr.l    PCM_WRITEREMAIN(a2)
  963.         clr.l    PCM_WRITEPTR(a2)
  964.  
  965.         move.l    a6,-(sp)
  966.         GET    SysBase
  967.         CALL    ReplyMsg
  968.         lea    PCM_WRITELIST(a2),a0
  969.         CALL    RemHead                ;any request in queue 
  970.         move.l    (sp)+,a6
  971.         move.l    PCM_BASEADR(a2),a0
  972.         move.b    #%101,UART_FCR(a0)        ;clear send-fifo
  973.                             ;(in case of abortio)
  974.         tst.l    d0
  975.         beq.b    .noqued
  976.  
  977.         move.l    d0,a1                ;activete next request
  978.         move.l    a1,PCM_WRITEREQ(a2)
  979.         move.l    IO_DATA(a1),PCM_WRITEPTR(a2)
  980.         move.l    IO_LENGTH(a1),PCM_WRITEREMAIN(a2)
  981.         bra.b    .sendmore
  982. .nowritereq
  983. .noqued        rts
  984.  
  985. .sendmore    btst    #STATUSB_USE7WIRE,PCM_FLAGS(a2)    ;CTS/RTS handshake?
  986.         beq.b    .sendbyte
  987.         btst    #STATUSB_CTS,PCM_FLAGS(a2)    ;Yes
  988.         beq.b    .nocts
  989.  
  990. .noctsrts    moveq    #0,d0
  991.         btst    #STATUSB_USEFIFO,PCM_FLAGS(a2)    ;use send-fifo?
  992.         beq.b    .sendbyte
  993.         moveq    #15,d0                ;fill max 16 bytes
  994.  
  995. .sendbyte    move.l    PCM_BASEADR(a2),a0
  996.         move.l    PCM_WRITEPTR(a2),a1
  997.         move.b    (a1),UART_THR(a0)        ;write to UART
  998.         addq.l    #1,PCM_WRITEPTR(a2)
  999.         subq.l    #1,PCM_WRITEREMAIN(a2)
  1000.         beq.b    .nocts
  1001.         move.l    PCM_WRITEREQ(a2),a1
  1002.         addq.l    #1,IO_ACTUAL(a1)
  1003.         dbf    d0,.sendbyte
  1004.  
  1005. .nocts        rts
  1006.  
  1007. ;========================================================================
  1008. ;---cmd_write---
  1009. ;a1=IORequest
  1010. ;========================================================================
  1011. cmd_write    move.l    a2,-(sp)
  1012.         clr.b    IO_FLAGS(a1)
  1013.         clr.l    IO_ACTUAL(a1)
  1014.         move.l    IO_LENGTH(a1),d0
  1015.         cmp.l    #-1,d0            ;0-terminated?
  1016.         bne.b    .notterm
  1017.  
  1018.         moveq    #0,d0
  1019.         move.l    IO_DATA(a1),a0
  1020.  
  1021. .lengthloop    tst.b    (a0)+
  1022.         beq.b    .notterm
  1023.         addq.l    #1,d0
  1024.         bra.b    .lengthloop
  1025.  
  1026. .notterm    move.l    d0,IO_LENGTH(a1)
  1027.         GET    SysBase
  1028.         CALL    Disable
  1029.         move.l    IO_UNIT(a1),a2
  1030.         tst.l    PCM_WRITEREQ(a2)    ;Any pending reuqest?
  1031.         beq.b    .noque
  1032.  
  1033.         lea    PCM_WRITELIST(a2),a0    ;Queue request
  1034.         CALL    AddTail
  1035.         bra.b    .exit
  1036.  
  1037. .noque        move.l    a1,PCM_WRITEREQ(a2)
  1038.         move.l    IO_DATA(a1),PCM_WRITEPTR(a2)
  1039.         move.l    IO_LENGTH(a1),PCM_WRITEREMAIN(a2)
  1040.         bsr.w    senddata
  1041. .exit        CALL    Enable
  1042.         move.l    (sp)+,a2
  1043.         rts
  1044.  
  1045. ;========================================================================
  1046. ;---cmd_query---
  1047. ;a1=IORequest
  1048. ;========================================================================
  1049. cmd_query    move.l    a6,-(sp)
  1050.         move.l    IO_UNIT(a1),a0
  1051.         move.l    PCM_BASEADR(a0),a0
  1052.         move.b    UART_MSR(a0),d1
  1053.  
  1054.         move.w    #%00111000,d0
  1055.         btst    #6,d1    ;RING?
  1056.         beq.b    .noring
  1057.         bset    #2,d0
  1058.  
  1059. .noring        btst    #5,d1    ;/DSR?
  1060.         beq.b    .dsr
  1061.         bclr    #3,d0
  1062.  
  1063. .dsr        btst    #4,d1    ;/CTS?
  1064.         beq.b    .cts
  1065.         bclr    #4,d0
  1066.  
  1067. .cts        btst    #7,d1    ;/CD?
  1068.         beq.b    .cd
  1069.         bclr    #5,d0
  1070.  
  1071. .cd        GET    SysBase
  1072.         CALL    Disable
  1073.         move.l    IO_UNIT(a1),a0
  1074.         move.l    PCM_RECBUFFCURRSIZE(a0),IO_ACTUAL(a1)
  1075.         move.w    d0,IO_STATUS(a1)
  1076.  
  1077.         btst    #IOB_QUICK,IO_FLAGS(a1)
  1078.         bne.b    .quickio
  1079.         CALL    ReplyMsg
  1080. .quickio    CALL    Enable
  1081.         move.l    (sp)+,a6
  1082.         rts
  1083.  
  1084. ;========================================================================
  1085. ;---cmd_setparams---
  1086. ;a1=IORequest
  1087. ;========================================================================
  1088. cmd_setparams    move.l    a6,-(sp)
  1089.         GET    SysBase
  1090.         CALL    Disable
  1091.  
  1092.         bsr.b    setparams
  1093.  
  1094.         btst    #IOB_QUICK,IO_FLAGS(a1)
  1095.         bne.b    .quickio
  1096.         CALL    ReplyMsg
  1097. .quickio    CALL    Enable
  1098.         move.l    (sp)+,a6
  1099.         rts
  1100.  
  1101. ;========================================================================
  1102. ;---setparams---
  1103. ;a1=IORequest
  1104. ;========================================================================
  1105. setparams    move.l    IO_UNIT(a1),a0
  1106.         move.l    PCM_BASEADR(a0),a0
  1107.  
  1108. ;calc, check and set BAUD
  1109.         move.l    IO_BAUD(a1),d1
  1110.         cmp.l    #115201,d1
  1111.         bge.w    .badbaud
  1112.         cmp.l    #109,d1
  1113.         bls.w    .badbaud
  1114.  
  1115.         move.l    #115200,d0
  1116.         divu    d1,d0
  1117.         bset    #7,UART_LCR(a0)        ;set DLAB
  1118.         move.b    d0,UART_DLL(a0)
  1119.         lsr.w    #8,d0
  1120.         move.b    d0,UART_DLM(a0)
  1121.         bclr    #7,UART_LCR(a0)        ;clear DLAB
  1122.  
  1123. ;check and set word length
  1124.         move.b    IO_READLEN(a1),d0
  1125.         cmp.b    IO_WRITELEN(a1),d0
  1126.         bne.b    .badparam
  1127.         cmp.b    #6,IO_READLEN(a1)
  1128.         bls.b    .badparam
  1129.         cmp.b    #9,IO_READLEN(a1)
  1130.         bge.b    .badparam
  1131.         move.b    IO_READLEN(a1),d0
  1132.         sub.b    #5,d0
  1133.         and.b    #$3,d0
  1134.         and.b    #%11111100,UART_LCR(a0)
  1135.         or.b    d0,UART_LCR(a0)
  1136.  
  1137. ;check and set # of stopbits
  1138.         cmp.b    #1,IO_STOPBITS(a1)    ;1 stop bit?
  1139.         beq.b    .1stopbit
  1140.         cmp.b    #2,IO_STOPBITS(a1)    ;no, well no more than 2 then?
  1141.         bne.b    .badparam
  1142.         bset    #2,UART_LCR(a0)
  1143.         bra.b    .cont
  1144. .1stopbit    bclr    #2,UART_LCR(a0)
  1145. .cont
  1146. ;check and set parity
  1147.         and.b    #%11000111,UART_LCR(a0)    ;mask away parity
  1148.         btst    #SERB_PARTY_ON,IO_SERFLAGS(a1)
  1149.         beq.b    .noparity
  1150.         bset    #3,UART_LCR(a0)
  1151.         btst    #SERB_PARTY_ODD,IO_SERFLAGS(a1)
  1152.         bne.b    .parityodd
  1153.         bset    #4,UART_LCR(a0)
  1154. .parityodd
  1155. .noparity
  1156.         rts
  1157.  
  1158. .badparam    move.b    #SerErr_InvParam,IO_ERROR(a1)
  1159.         rts
  1160.  
  1161. .badbaud    move.b    #SerErr_BaudMismatch,IO_ERROR(a1)
  1162.         rts
  1163.  
  1164. ;========================================================================
  1165. ;---cmd_reset--- removes queued and active IO-requests
  1166. ;a1=IORequest
  1167. ;========================================================================
  1168. cmd_reset    move.l    a2,-(sp)
  1169.         GET    SysBase
  1170.         CALL    Disable
  1171.  
  1172.         move.l    IO_UNIT(a1),a2    
  1173.         move.l    a1,-(sp)
  1174.         bsr.b    reset
  1175.         move.l    (sp)+,a1
  1176.  
  1177.         btst    #IOB_QUICK,IO_FLAGS(a1)
  1178.         bne.b    .quickio
  1179.         CALL    ReplyMsg
  1180. .quickio    CALL    Enable
  1181.         move.l    (sp)+,a2
  1182.         rts
  1183.  
  1184. ;========================================================================
  1185. ;---reset--- removes queued and active IO-requests
  1186. ;a2=serunit
  1187. ;========================================================================
  1188. reset        bsr.b    flush        ;remove queued IO-requests
  1189.  
  1190.         tst.l    PCM_READREQ(a2)    ;any current read-reqsuests?
  1191.         beq.b    .notreadcurr
  1192.         clr.l    PCM_READREMAIN(a2)
  1193.         move.l    PCM_READREQ(a2),a1
  1194.         move.b    #IOERR_ABORTED,IO_ERROR(a1)
  1195.         bsr.w    readdata
  1196.  
  1197. .notreadcurr    tst.l    PCM_WRITEREQ(a2)    ;any current write-requests?
  1198.         beq.b    .exit
  1199.         clr.l    PCM_WRITEREMAIN(a2)
  1200.         move.l    PCM_WRITEREQ(a2),a1
  1201.         move.b    #IOERR_ABORTED,IO_ERROR(a1)
  1202.         bsr.w    senddata
  1203. .exit        rts
  1204.  
  1205. ;========================================================================
  1206. ;---cmd_flush--- flush all queued IO-requests (not active)
  1207. ;a1=IORequest
  1208. ;========================================================================
  1209. cmd_flush    move.l    a2,-(sp)
  1210.         GET    SysBase
  1211.         CALL    Disable
  1212.         move.l    IO_UNIT(a1),a2    
  1213.  
  1214.         move.l    a1,-(sp)
  1215.         bsr.b    flush
  1216.         move.l    (sp)+,a1
  1217.  
  1218.         btst    #IOB_QUICK,IO_FLAGS(a1)
  1219.         bne.b    .quickio
  1220.         CALL    ReplyMsg
  1221. .quickio    CALL    Enable
  1222.         move.l    (sp)+,a2
  1223.         rts
  1224.  
  1225. ;========================================================================
  1226. ;---flush--- flush all queued IO-requests (not active)
  1227. ;a2=serunit
  1228. ;========================================================================
  1229. flush        lea    PCM_READLIST(a2),a0
  1230.         bsr.b    .replylist
  1231.         lea    PCM_WRITELIST(a2),a0
  1232.         bsr.b    .replylist
  1233.         rts
  1234.  
  1235. .replylist    move.l    a0,-(sp)
  1236.         CALL    RemHead
  1237.         move.l    (sp)+,a0
  1238.         tst.l    d0
  1239.         bne.b    .reply
  1240.         rts
  1241.  
  1242. .reply        move.l    d0,a1
  1243.         move.b    #IOERR_ABORTED,IO_ERROR(a1)
  1244.         clr.b    IO_FLAGS(a1)
  1245.         move.l    a0,-(sp)
  1246.         CALL    ReplyMsg
  1247.         move.l    (sp)+,a0
  1248.         bra.b    .replylist
  1249.  
  1250. ;========================================================================
  1251. ;---cmd_clear--- resets the devices internal readbuffer pointers
  1252. ;a1=IORequest
  1253. ;========================================================================
  1254. cmd_clear    GET    SysBase
  1255.         CALL    Disable
  1256.         move.l    IO_UNIT(a1),a0
  1257.         move.l    PCM_RECBUFFPTR(a0),PCM_RECBUFFINPTR(a0)
  1258.         move.l    PCM_RECBUFFPTR(a0),PCM_RECBUFFOUTPTR(a0)
  1259.         clr.l    PCM_RECBUFFCURRSIZE(a0)
  1260.  
  1261.         btst    #IOB_QUICK,IO_FLAGS(a1)
  1262.         bne.b    .quickio
  1263.         CALL    ReplyMsg
  1264. .quickio    CALL    Enable
  1265.         rts
  1266.  
  1267. ;========================================================================
  1268. ;---cmdbreak--- send break (not implemented yet)
  1269. ;a1=IORequest
  1270. ;========================================================================
  1271. cmd_break    GET    SysBase
  1272.         CALL    Disable
  1273.  
  1274.  
  1275.         btst    #IOB_QUICK,IO_FLAGS(a1)
  1276.         bne.b    .quickio
  1277.         CALL    ReplyMsg
  1278. .quickio    CALL    Enable
  1279.         rts
  1280.  
  1281. ;========================================================================
  1282.         cnop    0,4
  1283. endofcode
  1284.         section    buffers,bss
  1285. tuplebuffer    ds.b    100
  1286. serdata        ds.b    PCMNODE_SIZEOF*UNITS
  1287.